home *** CD-ROM | disk | FTP | other *** search
/ MacUser Mac Bin 36 / MACUSER-MACBIN36-1996-11.ISO.7z / MACUSER-MACBIN36-1996-11.ISO / READER'S GALLERY / 東京都 本多欣亮 / Bring To Above / bring to above.c < prev    next >
C/C++ Source or Header  |  1996-09-06  |  6KB  |  374 lines

  1. /*
  2. **
  3. **    bring to above.c
  4. **
  5. */
  6. /*
  7. #if THINK_C
  8. #include <BDC.h>
  9. #else
  10. #include <Packages.h>
  11. #endif
  12. #include <Errors.h>
  13. #include <Memory.h>
  14. #include <Resources.h>
  15. #include <Script.h>
  16. #include <ToolUtils.h>
  17. */
  18. #include "AIPluginInterface.h"
  19. #include "bring to above.h"
  20.  
  21.  
  22. FXErr
  23. main(AIFilterPB *pb)
  24. {
  25.     FXErr            error=kNoErr ;
  26.  
  27.     switch(pb->selector) {
  28.  
  29.         case kSelectorPluginInterfaceVersion :
  30.         error=DoVersion() ;
  31.         break ;
  32.  
  33.         case kSelectorPluginStartUp :
  34.         error=DoStartup(pb) ;
  35.         break ;
  36.  
  37.         case kSelectorPluginAbout :
  38.         error=DoAbout(pb) ;
  39.         break ;
  40.  
  41.         case kSelectorGetParameters :
  42.         error=DoOption(pb) ;
  43.         break ;
  44.  
  45.         case kSelectorGo :
  46.         error=DoFilter(pb) ;
  47.         break ;
  48.  
  49.     }
  50.  
  51.     ReportError(pb,error) ;
  52.  
  53.     return(error) ;
  54. }
  55.  
  56.  
  57. pascal FXErr
  58. DoVersion(void)
  59. {
  60.     FXErr            error=kPluginInterfaceVersion ;
  61.  
  62.     return(error) ;
  63. }
  64.  
  65.  
  66. pascal FXErr
  67. DoStartup(AIFilterPB *pb)
  68. {
  69.     AIFunctions *f=pb->functions ;
  70.     Handle            strings=0 ;
  71.     unsigned char *category,*name ;
  72.     short            total,variation ;
  73.     FXErr            error=kNoErr ;
  74.  
  75.     strings=Get1Resource('STR#',kFilterSTR_) ;
  76.     if(!strings) {
  77.         error=ResError() ;
  78.         goto err ;
  79.     }
  80.  
  81.     MoveHHi(strings) ;
  82.     HLock(strings) ;
  83.  
  84.         category=(unsigned char *)*strings ;
  85.         total=*(short *)category>>1 ;
  86.         category+=sizeof(short) ;
  87.         for(variation=0; variation<total; variation++) {
  88.             name=category+*category+1 ;
  89.             error=f->AddFilter(category,name,variation) ;
  90.             if(error) {
  91.                 goto err ;
  92.             }
  93.             category=name+*name+1 ;
  94.         }
  95.  
  96. err :
  97.     if(strings) {
  98.         HUnlock(strings) ;
  99.         ReleaseResource(strings) ;
  100.     }
  101.     return(error) ;
  102. }
  103.  
  104.  
  105. pascal FXErr
  106. DoAbout(AIFilterPB *pb)
  107. {
  108.     AIFunctions *f=pb->functions ;
  109.     DialogPtr        dialog=0 ;
  110.     short            itemHit ;
  111.     FXErr            error=kNoErr ;
  112.  
  113.     dialog=GetNewDialog(kAboutDLOG,0,(WindowPtr)-1) ;
  114.     if(!dialog) {
  115.         goto err ;
  116.     }
  117.  
  118.     ModalDialog(f->ModalDialogProc,&itemHit) ;
  119.  
  120. err :
  121.     if(dialog) {    
  122.         DisposeDialog(dialog) ;
  123.     }
  124.     return(error) ;
  125. }
  126.  
  127.  
  128. pascal FXErr
  129. DoOption(AIFilterPB *pb)
  130. {
  131.     FXErr            error=kNoErr ;
  132.  
  133.     return(error) ;
  134. }
  135.  
  136.  
  137. pascal FXErr
  138. DoFilter(AIFilterPB *pb)
  139. {
  140.     AIFunctions *f=pb->functions;
  141.     AIArtHandle **matches=0 ;
  142.     long                i,nMatch ;
  143.     FXErr            error=kNoErr ;
  144.  
  145.     error=CheckSelectedArts(pb,&matches,&nMatch) ;
  146.     if(error) {
  147.         goto err ;
  148.     }
  149.  
  150.     switch(pb->variation) {
  151.  
  152.         case 0:    /* bring to above */
  153.  
  154.         for(i=0; i<nMatch; i++) {
  155.             AIArtHandle        this=(*matches)[i], that ;
  156.             long                    attr ;
  157.  
  158.             HoldSelection(f,this) ;
  159.             error=GetTargetArt(f,&this) ;
  160.             if(this) {
  161.                 error=f->GetArtPriorSibling(this,&that) ;
  162.                 if(that) {
  163.                     error=f->GetArtUserAttr(that,kArtSelected,&attr) ;
  164.                     if(!(kArtSelected&attr)) {
  165.                         f->ReorderArt(this,kPlaceAbove,that) ;
  166.                     }
  167.                 }
  168.             }
  169.         }
  170.  
  171.         break ;
  172.  
  173.         case 1:    /* bring to below */
  174.  
  175.         for(i=nMatch-1; i>=0; i--) {
  176.             AIArtHandle        this=(*matches)[i], that ;
  177.             long                    attr ;
  178.  
  179.             HoldSelection(f,this) ;
  180.             error=GetTargetArt(f,&this) ;
  181.             if(this) {
  182.                 error=f->GetArtSibling(this,&that) ;
  183.                 if(that) {
  184.                     error=f->GetArtUserAttr(that,kArtSelected,&attr) ;
  185.                     if(!(kArtSelected&attr)) {
  186.                         f->ReorderArt(this,kPlaceBelow,that) ;
  187.                     }
  188.                 }
  189.             }
  190.         }
  191.  
  192.         break ;
  193.     }
  194.  
  195. err:
  196.     if(matches) {
  197.         DisposeHandle((Handle)matches) ;
  198.     }
  199.     return(error) ;
  200. }
  201.  
  202.  
  203. pascal void
  204. ReportError(AIFilterPB *pb,FXErr report)
  205. {
  206.     Str255            text ;
  207.     Handle            strings=0 ;
  208.     unsigned char *p ;
  209.     short            total,index ;
  210.     long                number ;
  211.     FXErr            error ;
  212.  
  213.     if(report==kNoErr
  214.     || report==kCanceledErr
  215.     || report==kPluginInterfaceVersion) {
  216.         goto err ;
  217.     }
  218.  
  219.     strings=Get1Resource('STR#',kErrorSTR_) ;
  220.     error=ResError() ;
  221.     if(error) {
  222.         goto err ;
  223.     }
  224.  
  225.     HLock(strings) ;
  226.     p=*(unsigned char **)strings ;
  227.  
  228.     total=*(short *)p>>1 ;
  229.     p+=sizeof(short) ;
  230.     for(index=0; index<total; index++) {
  231.         if(*(p+1)=='-'
  232.         || *(p+1)>='0'&&*(p+1)<='9') {
  233.             StringToNum(p,&number) ;
  234.         } else {
  235.             number=*(long *)(p+1) ;
  236.         }
  237.         p+=*p+1 ;
  238.         if(number==report
  239.         || index==total-1) {
  240.             break ;
  241.         }
  242.         p+=*p+1 ;
  243.     }
  244.     BlockMove(p,text,*p+1) ;
  245.  
  246.     ParamText(text,0,0,0) ;
  247.  
  248.     Alert(kErrorALRT,0) ;
  249.  
  250. err:
  251.     if(strings) {
  252.         HUnlock(strings) ;
  253.         ReleaseResource(strings) ;
  254.     }
  255. }
  256.  
  257.  
  258. pascal FXErr
  259. CheckSelectedArts(AIFilterPB *pb,AIArtHandle ***matches,long *nMatch)
  260. {
  261.     AIFunctions *f=pb->functions ;
  262.     AIMatchingArtSpec spec[4] ;
  263.     FXErr            error=kNoErr ;
  264.  
  265.     *matches=0 ;
  266.  
  267.     spec[0].type=kPathArt ;
  268.     spec[0].whichAttr=kArtSelected ;
  269.     spec[0].attr=kArtSelected ;
  270.  
  271.     spec[1].type=kMysteryPathArt ;
  272.     spec[1].whichAttr=kArtSelected ;
  273.     spec[1].attr=kArtSelected ;
  274.  
  275.     spec[2].type=kPlacedArt ;
  276.     spec[2].whichAttr=kArtSelected ;
  277.     spec[2].attr=kArtSelected ;
  278.  
  279.     spec[3].type=kTextArt ;
  280.     spec[3].whichAttr=kArtSelected ;
  281.     spec[3].attr=kArtSelected ;
  282.  
  283.     error=f->GetMatchingArt(spec,4,matches,nMatch) ;
  284.     if(error) {
  285.         goto err ;
  286.     }
  287.  
  288.     if(!*nMatch) {
  289.         error=kBadSelectionErr ;
  290.         goto err ;
  291.     }
  292.  
  293. err :
  294.     if(error&&*matches) {
  295.         DisposeHandle((Handle)*matches) ;
  296.     }
  297.  
  298.     return(error) ;
  299. }
  300.  
  301.  
  302. pascal FXErr
  303. GetTargetArt(AIFunctions *f,AIArtHandle *art)
  304. {
  305.     AIArtHandle        parent,sibling,child ;
  306.     long                    attr,level ;
  307.     short                type ;
  308.     Boolean            groupSelected=true ;
  309.     FXErr                error=kNoErr ;
  310.  
  311.     error=f->GetArtParent(*art,&parent) ;
  312.     error=f->GetArtType(parent,&type) ;
  313.     error=GetLevelOfArt(f,parent,&level) ;
  314.     if(((type==kGroupArt)||(type==kCompoundPathArt))&&(level>0)) {
  315.         error=f->GetArtFirstChild(parent,&child) ;
  316.         do {
  317.             error=f->GetArtUserAttr(child,kArtSelected,&attr) ;
  318.             groupSelected &= (attr&kArtSelected)?true:false ;
  319.             error=f->GetArtSibling(child,&child) ;
  320.         } while(child) ;
  321.         if(groupSelected) {
  322.             error=f->GetArtSibling(*art,&sibling) ;
  323.             if(sibling) {
  324.                 *art=nil ;
  325.             } else {
  326.                 *art=parent ;
  327.             }
  328.         } /* else let *art be */
  329.     }
  330.  
  331.     return(error) ;
  332. }
  333.  
  334.  
  335. pascal FXErr
  336. GetLevelOfArt(AIFunctions *f,AIArtHandle art,long *level)
  337. {
  338.     FXErr        error = kNoErr ;
  339.  
  340.     *level = 0 ;
  341.  
  342.     do {
  343.  
  344.         error=f->GetArtParent(art,&art) ;
  345.         if(error) art = nil ;
  346.  
  347.     } while(art && ++(*level)) ;
  348.  
  349.     return(error) ;
  350. }
  351.  
  352.  
  353. pascal FXErr
  354. HoldSelection(AIFunctions *f,AIArtHandle art)
  355. {
  356.     AIArtHandle        path ;
  357.     short                type ;
  358.     FixedMatrix         matrix ;
  359.     FXErr                error=kNoErr ;
  360.  
  361.     error=f->GetArtType(art,&type) ;
  362.     if(type==kTextArt) {
  363.         error=f->GetFirstTextPath(art,&path) ;
  364.         if(!error) {
  365.             f->GetTextPathMatrix(path,&matrix) ;
  366.             f->SetTextPathMatrix(path,&matrix) ;
  367.         }
  368.     } else {
  369.         f->SetArtUserAttr(art,kArtSelected,kArtSelected) ;
  370.     }
  371.  
  372.     return(error) ;
  373. }
  374.